#pragma once

#include <functional>
#include "TcpServer.h"
#include "HttpRequest.h"
#include "HttpResponse.h"

#define DEFAUL_TIMEOUT 10
class HttpServer
{
private:
    using Handler = std::function<void(const HttpRequest &, HttpResponse *)>;
    using Handlers = std::vector<std::pair<std::regex, Handler>>;

    // 有四个功能性请求的路由表
    Handlers _get_route;
    Handlers _post_route;
    Handlers _put_route;
    Handlers _delete_route;

    std::string _basedir; // 静态资源根目录
    TcpServer _server;

private:
    // 1. 错误处理函数
    void ErrorHandler(const HttpRequest &req, HttpResponse *rsp);

    // 2. 将HttpResponse中的要素按照http协议格式进行组织，发送
    void WriteResponse(const PtrConnection &conn, const HttpRequest &req, HttpResponse &rsp);

    // 3. 是否是一个静态资源请求
    bool IsFileHandler(const HttpRequest &req);

    // 4. 静态资源的请求处理
    void FileHandler(const HttpRequest &req, HttpResponse *rsp);

    // 5. 功能性请求的分类处理
    void Dispatcher(HttpRequest &req, HttpResponse *rsp, Handlers &handlers);

    // 6.
    void name(const HttpRequest &req, HttpResponse *rsp);

    // 7.
    void Route(HttpRequest &req, HttpResponse *rsp);

    // 8. 设置上下文
    void OnConnected(const PtrConnection &conn);

    // 9. 缓冲区数据解析 + 处理
    void OnMessage(const PtrConnection &conn, Buffer *buffer);

public:
    HttpServer(int port, int timeout = DEFAUL_TIMEOUT);

    // 1. 设置静态根路径
    void SetBaseDir(const std::string &path);

    // 2. 设置/添加，请求与处理函数的映射关系
    void Get(const std::string &pattern, const Handler &handler);
    void Post(const std::string &pattern, const Handler &handler);
    void Put(const std::string &pattern, const Handler &handler);
    void Delete(const std::string &pattern, const Handler &handler);
    void SetThreadCount(int count);
    void Listen();
};